﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;
/*
 * 
 * 2011.09.21 lcheng
 * 
 *    由于模板引擎调用正则表达式的地方非常多，所以在这里：
 *        使用Regex.CompileToAssembly把正则表达式编译为独立的程序集(dll)
 * 
 * 
 */
namespace TRPOP.CMS.Reg
{
    class Program
    {
        // 存放正则表达式的hashtable   
        public static Hashtable HashTableRegKeys = new Hashtable();

        // 编译正则表达式   
        public static void CompileExpressions()
        {
            // Reserve space for each expression   
            RegexCompilationInfo[] AllRegex = new RegexCompilationInfo[HashTableRegKeys.Count];
            int intRegIndex = 0;
            foreach (DictionaryEntry de in HashTableRegKeys)
            {
                AllRegex[intRegIndex++] = new RegexCompilationInfo((string)de.Value,        // 正则表达式的pattern   
                                                     RegexOptions.IgnoreCase,   // 指定设置   
                                                     (string)de.Key,          // pattern名称   
                                                     "TRPOP.CMS.RegAssembly", // 名称空间   
                                                     true);                  // 是否公开?   
            }
            // 成生一个新的assembly   
            System.Reflection.AssemblyName aName = new System.Reflection.AssemblyName();
            // 指定名称   
            aName.Name = "TRPOP.CMS.RegAssembly";
            // 编译所有的正则表达式到这个assembly   
            Regex.CompileToAssembly(AllRegex, aName);
        }

        /// <summary>
        /// 添加所有的正则
        /// </summary>
        public static void InitAllReg()
        {

            #region 标签匹配

            HashTableRegKeys.Add("Tags_AllTag",@"<(?<TagName>(?:include|cms|op|var|loop|\/loop|if|elseif|else|\/if))[\s>]|"+
                                                  @"\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]|" +
                                                  @"\[\$(?<DataSet>\w+)[.](?<var>\w+)\]|" +
                                                  @"\[\$(?<var>\w+)\]|" +
                                                  @"\[\@(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)\]");


            #region index 第一个可解析的标签
            /*
<(?<TagName>(?:include|cms|if|op|var|loop))\s|  <cms ...
\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]| [$asd]
\[\$(?<DataSet>\w+)[.](?<var>\w+)\]|
\[\$(?<var>\w+)\]|
\[\@(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)\]
             */
            /// <summary>
            /// 匹配并找到可解析的cms标签，返回第一个匹配的
            /// </summary>
            HashTableRegKeys.Add("Tags_AllIndex", @"<(?<TagName>(?:include|cms|if|op|var|loop))\s|" +
                                                  @"\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]|" +
                                                  @"\[\$(?<DataSet>\w+)[.](?<var>\w+)\]|" +
                                                  @"\[\$(?<var>\w+)\]|" +
                                                  @"\[\@(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)\]");
            /*@"(<(?<TagName>(?:include|cms|if|op|var|loop))\s)|" +
            @"(\[\$(" +
                        @"((?<DataSet>\w*)[.](?<index>\d*)[.](?<var>\w*))|" +
                        @"((?<DataSet>\w*)[.](?<var>\w*))|" +
                        @"((?<var>\w*))" +
                     @")" +
            @"\])|" +
            @"([\[][@](?<func>(?:\w|[!])+?)[(](?<param>[\s\S]*?)[)][\]])");
             */
            #endregion

            /// <summary>
            /// 标签操作导航
            /// 看到即需要解析的：include cms if op var loop
            /// 尚未实现 php header debug 标签
            /// </summary>
            HashTableRegKeys.Add("Tags_Index", @"<(?<TagName>(?:include|cms|if|op|var|loop))\s");
            //@"<(?<TagName>(?:(?:include)|(?:cms)|(?:if)|(?:op)|(?:var)|(?:loop)))\s");

            /// <summary>
            /// 标签操作导航 Loop
            /// </summary>
            HashTableRegKeys.Add("Tags_LoopIndex", @"<(?<TagName>\/{0,1}loop)[\s>]");
            //@"<(?<TagName>(([\/]loop)|(loop)))[\s>]");

            /// <summary>
            /// 匹配include标签
            /// </summary>
            HashTableRegKeys.Add("Tags_Include", @"<include(?<attribute>[^-\/>].*)\/>");

            /// <summary>
            /// 匹配 loop ，找到其属性说明
            /// </summary>
            HashTableRegKeys.Add("Tags_oneLoop", @"<loop(?<attribute>[^>]*?)>");

            /// <summary>
            /// 匹配属性   group[name] group[value]
            /// </summary>
            HashTableRegKeys.Add("Tags_Attribute", @"(?<name>\w*)=" + "\"" + @"(?<value>[\s\S]+?)" + "\"" + "");

            /// <summary>
            /// 匹配cms标签 的正则表达  group[attributes]
            /// </summary>
            HashTableRegKeys.Add("Tags_CMS", @"<cms(?<attribute>([^-\/>]).*)\/>");
            /// <summary>
            /// 匹配if标签
            /// </summary>
            HashTableRegKeys.Add("Tags_If", @"<if(?<attributes>[^>]+?)>(?<value>[\s\S]+?)</if>");
            /// <summary>
            /// 匹配所有的if语法标签
            /// </summary>
            HashTableRegKeys.Add("Tags_IfGramar", @"<(?<grammar>if|elseif)[^t]+?test='(?<test>[^']+?)'[\s\S]*?>|".Replace("'", "\"") +
                                                  @"<(?<grammar>else)>|" +
                                                  @"</(?<grammar>if)>");
            /*
              @"(<(?<grammar>(if)|(elseif))[^t]+?test=" + "\"" +
              @"(?<test>[^" + "\"" + "]+?)" + "\"" + @"[\s\S]*?>)|(<(?<grammar>else)>)|(</(?<grammar>if)>)");
            */
            /// <summary>
            /// 匹配op标签
            /// </summary>
            HashTableRegKeys.Add("Tags_Op", @"<op(?<attribute>([^-\/>]).*)\/>");
            /// <summary>
            /// 匹配Var标签
            /// </summary>
            HashTableRegKeys.Add("Tags_Var", @"<Var(?<attribute>([^>]).*)>");

            /// <summary>
            /// 匹配注释
            /// </summary>
            HashTableRegKeys.Add("Tags_Note", "<!--[^#]+?-->");
            //2011.07.21 更新 经过牛丰产确定的正则
            //@"<!--[^#]+?([^\/])+?-->";
            //"<!--[^#]+?([^\/])-->";
            //@"<!--[^#]+?-->";

            #endregion

            #region 匹配运算符
            /// <summary>
            /// 匹配 加减乘除
            /// </summary>
            HashTableRegKeys.Add("Tags_OperatorGramar", @"[^\+\-\*\/\(\)%]*");
            /// <summary>
            /// 匹配 字符串加运算
            /// </summary>
            HashTableRegKeys.Add("Tags_OperatorStringAddGramar", @"[^\.]*");
            /// <summary>
            /// 匹配 比较运算
            /// </summary>
            HashTableRegKeys.Add("Tags_OperatorCompireGramar", @"[!]{0,1}[a-zA-Z.0-9_)($''" + "\"" + "]+");//@"[^((\<)|(\>)|(\>=)|(\<=)|(\!=)|(\==)|(\||)|(\&&))]+";
            #endregion

            #region 匹配变量
            /*
\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]|
\[\$(?<DataSet>\w+)[.](?<var>\w+)\]|
\[\$(?<var>\w+)\]|
             */
            /// <summary>
            /// 匹配所有的变量 [$test] [$test.var] [$test.0.var]
            /// </summary>
            HashTableRegKeys.Add("Tags_AllTypeVar", @"\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]|" +
                                                    @"\[\$(?<DataSet>\w+)[.](?<var>\w+)\]|" +
                                                    @"\[\$(?<var>\w+)\]");
            /*
              @"\[\$(" +
                      @"((?<DataSet>(\w)*)[.](?<index>(\d)*)[.](?<var>(\w)*))|" +
                      @"((?<DataSet>(\w)*)[.](?<var>(\w)*))|" +
                      @"((?<var>\w*))" +
                   @")" +
               @"\]");*/
            /// <summary>
            /// 匹配_内容页变量 模板变量 [$test]
            /// </summary>
            HashTableRegKeys.Add("Tags_ContentVar", @"\[\$(?<var>\w+)\]");
            /// <summary>
            /// 匹配_当前数据集变量 [$test.var]
            /// </summary>
            HashTableRegKeys.Add("Tags_DataSetVar", @"\[\$(?<DataSet>\w+)[.](?<var>\w+)\]");//@"\[\$(?<DataSet>(\w)*)[.](?<var>(\w)*)\]");
            /// <summary>
            /// 匹配_当前数据集变量 [$test.0.var]
            /// </summary>
            HashTableRegKeys.Add("Tags_DataSetIndexVar", @"\[\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)\]");//@"\[\$(?<DataSet>(\w)*)[.](?<index>(\d)*)[.](?<var>(\w)*)\]");


            /// <summary>
            /// 匹配所有的变量 [$test] [$test.var] [$test.0.var]
            /// </summary>
            HashTableRegKeys.Add("Tags_AllTypeVarWithNoSign", @"\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)|" +
                                                    @"\$(?<DataSet>\w+)[.](?<var>\w+)|" +
                                                    @"\$(?<var>\w+)");

            /// <summary>
            /// 匹配_内容页变量 模板变量 $test
            /// </summary>
            HashTableRegKeys.Add("Tags_ContentVarWithNoSign", @"\$(?<var>\w+)");
            /// <summary>
            /// 匹配_当前数据集变量 $test.var
            /// </summary>
            HashTableRegKeys.Add("Tags_DataSetVarWithNoSign", @"\$(?<DataSet>\w+)[.](?<var>\w+)");//@"\$(?<DataSet>(\w)*)[.](?<var>(\w)*)");
            /// <summary>
            /// 匹配_当前数据集变量 $test.0.var
            /// </summary>
            HashTableRegKeys.Add("Tags_DataSetIndexVarWithNoSign", @"\$(?<DataSet>\w+)[.](?<index>\d+)[.](?<var>\w+)");//@"\$(?<DataSet>(\w)*)[.](?<index>(\d)+?)[.](?<var>(\w)*)");

            #endregion

            #region 匹配函数
            //\[\@(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)\]
            /// <summary>
            /// 匹配表达式中的 函数 带感叹号的
            /// </summary>                         
            HashTableRegKeys.Add("Tags_ExpFunc", @"(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)");//@"(?<func>((\w)|[!])+?)[(](?<param>[\s\S]*?)[)]");
            /// <summary>
            /// 普通的 函数 
            /// </summary>
            HashTableRegKeys.Add("Tags_Func", @"\[\@(?<func>(?:\w|\!)+?)\((?<param>[\s\S]*?)\)\]");//@"[\[][@](?<func>((\w)|[!])+?)[(](?<param>[\s\S]*?)[)][\]]");

            #endregion

            #region 匹配内容分页
            HashTableRegKeys.Add("ContantPageCut", @"\[page\s*:[\d\S]*\s*\]");//@"[[]page[\s]*:[\d\S]*[\s]*[]]");
            #endregion

            #region 匹配SQL的where
            HashTableRegKeys.Add("SqlWhereReg", @"(?<tablename>\S+)[.](?<column>\S+)");//@"(?<tablename>[\S]+)[.](?<column>[\S]+)");
            #endregion

            #region 匹配 ="" 模式的HTML
            HashTableRegKeys.Add("ConvertURLReg", @"[=][\'|\" + "\"" +
                                                   @"](?<filename>[/][\S]*)[\'|\" +
                                                   "\"" +
                                                   "]");
            HashTableRegKeys.Add("ConvertURLextraReg", @"[\S]*(?<extra>[_][\d]+[×][\d]+)[.][\S]*");
            #endregion

        }

        static void Main(string[] args)
        {
            InitAllReg();
            CompileExpressions();
        }
    }
}
